


# -------------------------------- __slots__ ------------------------------
# python 类的每个实例都有一个动态字典（`__dict__`）来存储属性。
#       这个字典允许动态添加任意属性，但字典本身会消耗相当多的内存。
#       例如，一个空的字典可能占用几百字节的内存。对于创建大量实例的类，这会显著增加内存使用。
# 使用 `__slots__` 后，Python 会为每个实例使用一个固定大小的数组（而不是字典）来存储属性。
#       这样，每个实例不再有 `__dict__`（除非在 `__slots__` 中显式包含 `'__dict__'`），从而节省了内存。

# 由于使用 `__slots__` 后，属性访问不再通过字典查找（字典查找涉及哈希计算，可能还有哈希冲突解决），而是直接通过数组索引访问。
#       因此，访问速度会更快

# 由于使用 `__slots__` 的实例在内存中是以固定大小分配的（因为属性是固定的，所以实例的大小也是固定的），因此可以避免内存碎片。
#       这尤其对于需要创建大量小对象的程序有益。

# 在默认情况下，每个实例有自己的字典，而字典是动态分配和调整大小的。这可能导致内存中出现许多大小不一的内存块，从而产生碎片。
#       而使用固定大小的实例，内存分配器可以更有效地管理内存，减少碎片。

# 使用 `__slots__` 后，实例不能再动态添加不在 `__slots__` 中的属性
# `__slots__` 不会继承。每个子类需要重新定义 `__slots__` 才能获得其效果





# 元类中定义 __slots__，可限制所有派生类的属性范围，实现架构级约束
# 价值​​：确保大型项目中所有核心类遵循内存优化规范，避免开发者意外引入 __dict__
class StrictMeta(type):
    __slots__ = ()  # 元类自身无动态属性
    def __new__(cls, name, bases, dct):
        if '__slots__' not in dct:
            raise TypeError(f"{name} 必须定义 __slots__")
        return super().__new__(cls, name, bases, dct)

class Entity(metaclass=StrictMeta):
    __slots__ = ('id',)  # 强制子类显式声明槽位



# 结合工厂模式动态创建高密度对象
def create_slotted_class(fields):
    return type('DynamicClass', (), {'__slots__': fields})

Point3D = create_slotted_class(('x', 'y', 'z'))
p = Point3D()
p.x, p.y, p.z = 1, 2, 3  # 无 __dict__ 开销    



# 复用带槽位的实例减少 GC 压力
# 百万级短生命周期对象场景下，内存分配耗时降低 40%
# 通过复用对象减少内存分配/释放频率，并利用槽位机制降低内存开销和垃圾回收（GC）压力

# __slots__ 通过预定义实例属性列表，消除对象内置字典 __dict__
#         减少单对象内存占用
#         提升访问速度​​：属性访问通过固定偏移量寻址，而非哈希查找
#         避免内存碎片​​：连续内存布局减少GC碎片化问题


# 槽位类本身不支持动态属性：显式使用 weakref 处理对象间关联（如树形结构
class TreeNode:
    __slots__ = ('data', 'parent_ref', 'children')
    def __init__(self, data):
        self.data = data
        self.parent_ref = None  # 弱引用父节点
        self.children = []




# -------------------------------- __new__ ------------------------------
# __new__` 是一个静态方法
# __new__ 必须返回一个对象，通常是 cls 的实例
# 如果 __new__ 返回的不是 cls 的实例，__init__ 不会被调用
# 对于 int, str, tuple 等不可变类型，通常需要在 __new__ 中完成所有修改
# __new__ 在每次实例创建时都会被调用，避免在其中进行耗时操作
# 在需要实现单例、自定义不可变类型、限制实例创建或工厂模式等高级场景时，__new__ 是一个强大的工具
# __new__ 提供了对实例创建过程的底层控制

class Base:
    def __new__(cls, *args, **kwargs):
        print(f"创建 {cls.__name__} 实例")
        return super().__new__(cls)
    
    def __init_subclass__(cls, **kwargs):
        print(f"初始化子类 {cls.__name__}")

class Child(Base):
    pass

c = Child()
# 初始化子类 Child
# 创建 Child 实例